import type { ColumnType } from 'antd/es/table/interface';
import * as ExcelJs from 'exceljs';
import type { Workbook, Worksheet, Row } from 'exceljs';
import { saveAs } from 'file-saver';
import type { ITableHeader } from './excelUtils';
import { addCellStyle, DEFAULT_COLUMN_WIDTH } from './excelUtils';

export interface ISheet {
  // sheet 的名字
  sheetName: string;
  // 这个 sheet 中表格的 column，类型同 antd 的 column
  columns: ColumnType<any>[];
  // 表格的数据
  dataSource: any[];
}

export interface IDownloadExcel {
  filename: string;
  sheets: ISheet[];
}
/**
 * 判断值是否为空
 *
 * @param {*} val
 * @return {*}
 */
export const isEmpty = (val: any): any => {
  if (Array.isArray(val)) {
    return val.length === 0;
  }
  return [null, undefined, ''].includes(val);
};

/**
 * 根据 新增指标公式
 * 计算 指标对应值
 * @param {指标完整内容} newIndicator
 * @param {当前数据} rowData
 * @return {*} 当前指标对应值
 *
 **/
export const newIndicatorValue = (newIndicator: CLOUMS.CLOUMSListItem, rowData: any): any => {
  // 指标类型为自定义指标
  if (newIndicator.type === '3') {
    let resultStr = '';
    // 自定义指标的 公式 遍历生成字符串运算 表达式
    newIndicator.computed?.forEach((el) => {
      switch (el.type) {
        case '1':
          // 四则运算及符号拼接为 字符串
          resultStr += el.name;
          break;
        case '2':
          resultStr += parseFloat(rowData[el.code]);
          break;
        default:
          break;
      }
    });
    /* eval 执行字符串表达式 */
    return eval(resultStr);
  }
};

/**
 * 下载导出简单的表格
 * @param params
 */
export function downloadExcel(params: IDownloadExcel) {
  console.log({ params });
  // 创建工作簿
  const workbook = new ExcelJs.Workbook();
  params?.sheets?.forEach((sheet) => handleEachSheet(workbook, sheet));
  saveWorkbook(workbook, `${params.filename}.xlsx`);
}

function handleEachSheet(workbook: Workbook, sheet: ISheet) {
  // 添加sheet
  const worksheet = workbook.addWorksheet(sheet.sheetName);
  // 设置 sheet 的默认行高。设置默认行高跟自动撑开单元格冲突
  // worksheet.properties.defaultRowHeight = 20;
  // 设置列
  /* 过滤列 */

  // TODO:

  worksheet.columns = generateHeaders(sheet.columns);
  handleHeader(worksheet);
  // handleData(worksheet, sheet);
  handleDataWithRender(worksheet, sheet);
}

export function handleHeader(worksheet: Worksheet) {
  // 给表头添加背景色。因为表头是第一行，可以通过 getRow(1) 来获取表头这一行
  const headerRow = worksheet.getRow(1);
  headerRow.height = 22;
  // 通过 cell 设置样式，更精准
  headerRow.eachCell((cell) =>
    addCellStyle(cell, { color: 'dff8ff', fontSize: 12, horizontal: 'left' }),
  );
}

/**
 * 如果 column 有 render 函数，则以 render 渲染的结果显示
 * @param worksheet
 * @param sheet
 */
function handleDataWithRender(worksheet: Worksheet, sheet: ISheet) {
  const { dataSource, columns } = sheet;
  const rowsData = dataSource?.map((data) => {
    return columns?.map((column) => {
      if (column.dataIndex === 'index' || column.dataIndex === 'option') {
        return;
      }
      // @ts-ignore
      const renderResult = column?.render?.(data[column.dataIndex], data);
      if (renderResult) {
        // 如果不是 object 说明没包裹标签，是基本类型直接返回
        if (typeof renderResult !== 'object') {
          return renderResult;
        }
        // 如果是 object 说明包裹了标签，逐级取出值
        return getValueFromRender(renderResult);
      }

      // @ts-ignore
      return data[column.dataIndex];
    });
  });
  console.log({ rowsData });
  // 添加行
  const rows = worksheet.addRows(rowsData);
  // 设置每行的样式
  addStyleToData(rows);
}

export function saveWorkbook(workbook: Workbook, fileName: string) {
  // 导出文件
  workbook.xlsx.writeBuffer().then((data: any) => {
    const blob = new Blob([data], { type: '' });
    saveAs(blob, fileName);
  });
}

function addStyleToData(rows: Row[]) {
  // 设置每行的样式
  rows?.forEach((row) => {
    // 设置字体
    // eslint-disable-next-line no-param-reassign
    row.font = {
      size: 11,
      name: '微软雅黑',
    };
    // 设置对齐方式
    // eslint-disable-next-line no-param-reassign
    row.alignment = {
      vertical: 'middle',
      horizontal: 'left',
      wrapText: true,
    };
  });
}

// 递归取出 render 里的值
// @ts-ignore
function getValueFromRender(renderResult: any) {
  if (renderResult?.type) {
    const children = renderResult?.props?.children;
    if (children?.type) {
      return getValueFromRender(children);
    } else {
      return children;
    }
  }
  return '';
}

// 根据 antd 的 column 生成 exceljs 的 column
export function generateHeaders(columns: any[]) {
  return columns?.map((col) => {
    const obj: ITableHeader = {
      // 显示的 name
      header: col.title,
      // 用于数据匹配的 key
      key: col.dataIndex,
      // 列宽
      width: col.width / 5 > DEFAULT_COLUMN_WIDTH ? col.width / 5 : DEFAULT_COLUMN_WIDTH,
    };
    if (col.children) {
      obj.children = col.children?.map((item: any) => ({
        key: item.dataIndex,
        header: item.title,
        width: item.width,
        parentKey: col.dataIndex,
      }));
    }
    return obj;
  });
}
